/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.asportoonline.integration;

import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.asportoonline.entities.Categoria;

/**
 * Questa classe implementa i metodi di CategoriaFacade, necessari per interfacciarsi con l'entità
 * Categoria.
 * 
 * @author fe
 * @see Categoria
 */
@Stateless
public class CategoriaFacadeImplementation extends AbstractFacade<Categoria> implements CategoriaFacade{
    @PersistenceContext(unitName = "AsportoOnline-ejbPU")
    private EntityManager em;

    protected EntityManager getEntityManager() {
        return em;
    }

    public CategoriaFacadeImplementation() {
        super(Categoria.class);
    }
    
    /**
     * Cerca tutte le categorie presenti nel database.
     * 
     * @return restituisce una lista contenente tutte le categorie presenti nel database; 
     * se non ce ne sono restituisce null.
     * @see Categoria
     */
    @Override
    public List<Categoria> findAll() {
        Query query = em.createQuery("select c from Categoria c order by c.nome");
        List<Categoria> lc = (List<Categoria>)query.getResultList();
        if(lc==null || lc.isEmpty())    return null;
        return lc;     
    }
    
    /**
     * Inserisce una nuova categoria, che deve avere un nome univoco.
     * 
     * @param categoria 
     * @see Categoria
     */
    @Override
    public void create(Categoria cat) {
        em.persist(cat);
    }
    
    /**
     * Cerca una categoria in base al nome.
     * 
     * @param nomeCategoria  nome della categoria.
     * @return se il nome esiste restituisce la Categoria, altrimenti restituisce null.
     * @see Categoria
     */
    public Categoria find(String nomeCategoria) {
        Query query = em.createQuery("select c from Categoria c where c.nome = :nome");
        query.setParameter("nome", nomeCategoria);
        List<Categoria> lc = (List<Categoria>)query.getResultList();
        if(lc==null || lc.isEmpty())    return null;
        return (Categoria)lc.get(0);     
    }

    /**
     * Cerca i nomi di tutte le categorie presenti nel database.
     * 
     * @return restituisce una lista contenente i nomi di tutte le categorie presenti nel database; 
     * se non ce ne sono restituisce null.
     */
    public List<String> findAllNames() {
        Query query = em.createQuery("select distinct c.nome from Categoria c order by c.nome");
        List<String> lcn = (List<String>)query.getResultList();
        if(lcn==null || lcn.isEmpty())    return null;
        return lcn;     
    }
}
